package repository

import (
	"context"
	"errors"
	"server_go/internal/model"
)

type TagRepository interface {
	GetTags(ctx context.Context) (*[]model.Tag, error)
	CreateTag(ctx context.Context, name string) (*model.Tag, error)
	DeleteTag(ctx context.Context, id uint) error
	GetTagById(ctx context.Context, id uint) (*model.Tag, error)
}

func NewTagRepository(
	repository *Repository,
) TagRepository {
	return &tagRepository{
		Repository: repository,
	}
}

type tagRepository struct {
	*Repository
}

func (r *tagRepository) GetTags(ctx context.Context) (*[]model.Tag, error) {
	var tag []model.Tag
	err := r.DB(ctx).Limit(1000000000).Offset(1).Find(&tag).Error
	if err != nil {
		return nil, err
	}
	return &tag, nil
}
func (r *tagRepository) GetTagById(ctx context.Context, id uint) (*model.Tag, error) {
	var tag model.Tag
	err := r.DB(ctx).First(&tag, id).Error
	if err != nil {
		return nil, err
	}
	return &tag, nil
}

func (r *tagRepository) CreateTag(ctx context.Context, name string) (*model.Tag, error) {
	var existingTag model.Tag
	//判断标签是否存在
	err := r.DB(ctx).Where("name = ?", name).Take(&existingTag).Error
	if err == nil {
		return nil, errors.New("不可创建已有的标签")
	}
	tag := model.Tag{Name: name}
	err = r.DB(ctx).Create(&tag).Error
	if err != nil {
		return nil, err
	}
	return &tag, nil
}

func (r *tagRepository) DeleteTag(ctx context.Context, id uint) error {
	return r.DB(ctx).Where("id= ? ", id).Delete(&model.Tag{}, id).Error
}
